package com.vehiclemanagement.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.vehiclemanagement.entity.AccidentRecord;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 车辆事故记录服务接口
 */
public interface AccidentRecordService extends IService<AccidentRecord> {

    /**
     * 分页查询事故记录
     *
     * @param current        当前页
     * @param size           每页大小
     * @param searchTerm     搜索关键词
     * @param vehicleId      车辆ID
     * @param driverId       驾驶员ID
     * @param accidentType   事故类型
     * @param responsibility 责任认定
     * @param status         处理状态
     * @param startTime      开始时间
     * @param endTime        结束时间
     * @return 分页结果
     */
    IPage<AccidentRecord> pageAccidents(Integer current, Integer size, String searchTerm,
                                      Long vehicleId, Long driverId, Integer accidentType, 
                                      Integer responsibility, Integer status, 
                                      LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 根据ID获取事故记录
     *
     * @param id 记录ID
     * @return 事故记录
     */
    AccidentRecord getAccidentById(Long id);

    /**
     * 添加事故记录
     *
     * @param accident 事故记录
     * @return 添加结果
     */
    boolean addAccident(AccidentRecord accident);

    /**
     * 更新事故记录
     *
     * @param accident 事故记录
     * @return 更新结果
     */
    boolean updateAccident(AccidentRecord accident);

    /**
     * 删除事故记录
     *
     * @param id 记录ID
     * @return 删除结果
     */
    boolean deleteAccident(Long id);

    /**
     * 处理事故记录
     *
     * @param id             事故记录ID
     * @param handler        处理人
     * @param handlingResult 处理结果
     * @param remark         备注
     * @return 处理结果
     */
    boolean handleAccident(Long id, String handler, String handlingResult, String remark);

    /**
     * 计算事故的实际损失（维修费+赔偿费-保险理赔）
     *
     * @param repairCost           维修费用
     * @param compensationCost     赔偿费用
     * @param insuranceClaimAmount 保险理赔金额
     * @return 实际损失
     */
    BigDecimal calculateActualLoss(BigDecimal repairCost, BigDecimal compensationCost, BigDecimal insuranceClaimAmount);

    /**
     * 计算指定车辆的累计维修费用
     *
     * @param vehicleId 车辆ID
     * @return 累计维修费用
     */
    BigDecimal sumRepairCostByVehicleId(Long vehicleId);

    /**
     * 计算指定车辆的累计赔偿费用
     *
     * @param vehicleId 车辆ID
     * @return 累计赔偿费用
     */
    BigDecimal sumCompensationCostByVehicleId(Long vehicleId);

    /**
     * 计算指定车辆的累计保险理赔金额
     *
     * @param vehicleId 车辆ID
     * @return 累计保险理赔金额
     */
    BigDecimal sumInsuranceClaimByVehicleId(Long vehicleId);

    /**
     * 计算指定车辆的累计实际损失
     *
     * @param vehicleId 车辆ID
     * @return 累计实际损失
     */
    BigDecimal sumActualLossByVehicleId(Long vehicleId);

    /**
     * 计算指定驾驶员的累计事故次数
     *
     * @param driverId 驾驶员ID
     * @return 累计事故次数
     */
    Integer countAccidentsByDriverId(Long driverId);

    /**
     * 按月统计事故数量和损失金额
     *
     * @param year 年份
     * @return 月度统计结果
     */
    List<Map<String, Object>> statisticsByMonth(Integer year);

    /**
     * 按事故类型统计事故数量和损失金额
     *
     * @return 事故类型统计结果
     */
    List<Map<String, Object>> statisticsByType();
} 